package com.foftact.etfweekly;

import java.util.List;

/**
 * ETF周线数据服务接口
 * 定义ETF周线数据的业务逻辑方法
 */
public interface ETFWeeklyService {
    /**
     * 从外部API抓取ETF周线数据并保存到数据库
     * @param code 板块/ETF代码
     * @return 是否抓取成功
     */
    boolean fetchAndSaveETFWeeklyData(String code);

    /**
     * 根据板块/ETF代码和日期范围获取ETF周线数据
     * @param code 板块/ETF代码
     * @param startDate 开始日期（格式：YYYY-MM-DD）
     * @param endDate 结束日期（格式：YYYY-MM-DD）
     * @return ETF周线数据列表
     */
    List<ETFWeekly> getETFWeeklyByCodeAndDateRange(String code, String startDate, String endDate);

    /**
     * 获取所有ETF周线数据
     * @return ETF周线数据列表
     */
    List<ETFWeekly> getAllETFWeekly();

    /**
     * 保存单个ETF周线数据
     * @param etfWeekly ETF周线数据
     * @return 是否保存成功
     */
    boolean saveETFWeekly(ETFWeekly etfWeekly);

    /**
     * 批量保存ETF周线数据
     * @param etfWeeklyList ETF周线数据列表
     * @return 是否批量保存成功
     */
    boolean batchSaveETFWeekly(List<ETFWeekly> etfWeeklyList);

    /**
     * 更新ETF周线数据
     * @param etfWeekly ETF周线数据
     * @return 是否更新成功
     */
    boolean updateETFWeekly(ETFWeekly etfWeekly);

    /**
     * 删除ETF周线数据
     * @param id 主键ID
     * @return 是否删除成功
     */
    boolean deleteETFWeekly(Long id);

    /**
     * 根据板块/ETF代码和日期删除ETF周线数据
     * @param code 板块/ETF代码
     * @param weekDate 周线日期（格式：YYYY-MM-DD）
     * @return 是否删除成功
     */
    boolean deleteETFWeeklyByCodeAndDate(String code, String weekDate);

    /**
     * 获取指定板块/ETF的最近N条周线数据
     * @param code 板块/ETF代码
     * @param limit 记录条数
     * @return ETF周线数据列表
     */
    List<ETFWeekly> getRecentETFWeeklyByCode(String code, Integer limit);
    
    /**
     * 根据需求写入或更新ETF周线数据
     * 规则：1. 先查询最近10条数据，如果存在则不写入（除近3条外）
     *      2. 如果近10条数据不存在或不完整，则写入更新近1年所有数据
     *      3. 近3条数据无论是否存在都要更新
     * @param code 板块/ETF代码
     * @param dataList 要写入的数据列表
     * @return 是否操作成功
     */
    boolean writeOrUpdateETFWeeklyData(String code, List<ETFWeekly> dataList);

    /**
     * 清空ETF周线表
     * @return 是否清空成功
     */
    boolean truncateETFWeeklyTable();
}